package leetcode100;

/**
 * @author shkstart
 * @create 2022-12-29-20:06
 */
public class Meme27_2 {
    public static int add(int a,int b){
        /**
         * 问题2：第一步骤不用加法如何得到相同结果？异或
         * 异或：相同为0，相异为1
         *
         * 1100 ^ 1111 = 0011
         *
         * 问题3：第二步骤不用加法如何得到相同结果？相与，左移一位
         * 如果一个位置上的数字相遇能得到1 ，那么表示，位置上的数字都是1，然后在往左移动一位，就是步骤二 进位得到的结果
         *
         * (1100 & 1111) << 1 = 11000
         */

        while(b!=0){
            int temp = a^b;
            b = (a & b)<<1;
            a =temp ;//一样为0，不一样为1 ，有1说明有进位
            /**
             * a = a^b;
             * b=(a&b)<<1;
             * 会报错的原因是提前改变了a的值，第二行要用的是改变前的a
             */
        }
        return a;
    }

    public static void main(String[] args) {
        int add = add(1, 2);
        System.out.println(add);
    }
}
